﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WAVEZ
{
    class Personagem : Objeto3D
    {
        private bool moverX, moverZ;
        public bool tomandoDano;
        private float velocidadeMax, aceleracao, desaceleracao;
        public float velocidadeSlow;
        public float mouseScroll, mouseScrollAtual, ValorSlow, ContagemSlow, valorInvertido;
        public int vida, tomandoDanoContagem;

        public static Personagem Self;

        MouseState mouse;
        int contagemTiro;
        bool atirou;

        public Personagem(Model modelo)
            : base(modelo)
        {
            moverX = false;
            moverZ = false;
            velocidadeSlow = 1;
            velocidadeMax = 0.7f;
            aceleracao = 0.04f;
            desaceleracao = 0.06f;
            ContagemSlow = 1;
            vida = 3;
            Self = this;
            tomandoDano = false;
            tomandoDanoContagem = 0;
        }




        public override void Update(GameTime gameTime)
        {

            mouse = Mouse.GetState();

            if ((mouse.LeftButton == ButtonState.Pressed)
                && (!atirou))
            {


                Vector3 destino = Camera3D.Self.MousePosition(Mouse.GetState());

                double angleRadian = Math.Atan2((double)(this.posicao.X - destino.X), (double)(this.posicao.Z - destino.Z));

                float angleDegrees = -MathHelper.ToDegrees((float)angleRadian);

                TiroManager.CriarTiro(this.posicao, -5 + angleDegrees);
                TiroManager.CriarTiro(this.posicao, -2.5f + angleDegrees);
                TiroManager.CriarTiro(this.posicao, 0 + angleDegrees);
                TiroManager.CriarTiro(this.posicao, 2.5f + angleDegrees);
                TiroManager.CriarTiro(this.posicao, 5 + angleDegrees);
                atirou = true;
                contagemTiro = 0;
            }


            if (atirou)
            {
                contagemTiro++;

                if (contagemTiro >= 5 * valorInvertido)
                {
                    atirou = false;
                }
            }

            //if (Controller.KeyDown(Keys.E) && InimigoManager.listaInimigos.Count == 0)
            //{
            //    InimigoManager.CriarInimigo(new Vector3(0, -35, 0),1);
            //}

            if (tomandoDano)
            {
                tomandoDanoContagem++;

                #region Piscando
                if (tomandoDanoContagem == 1)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 10)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem == 20)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 30)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem == 40)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 50)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem == 60)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 70)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem == 80)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 90)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem == 100)
                {
                    this.visible = false;
                }

                if (tomandoDanoContagem == 110)
                {
                    this.visible = true;
                }

                if (tomandoDanoContagem > 110)
                {
                    tomandoDano = false;
                }
                #endregion
            }

            moverPersonagem();
            SlowMotion();
            base.Update(gameTime);

        }

        private void SlowMotion()
        {
            mouseScroll = Mouse.GetState().ScrollWheelValue;

            if (mouseScroll > mouseScrollAtual)
            {
                ValorSlow += 1;
            }

            if (mouseScroll < mouseScrollAtual)
            {
                ValorSlow -= 1;
            }

            if (ValorSlow > 3)
            {
                ValorSlow = 3;
            }

            if (ValorSlow < -3)
            {
                ValorSlow = -3;
            }

            if (Mouse.GetState().RightButton == ButtonState.Pressed)
            {
                ValorSlow = 0;
            }

            if (ValorSlow == 3)
            {
                Nivel_Teste.instancia.nivelSlow = 1.6f;
                this.ContagemSlow = 1.6f;
                this.valorInvertido = 0.62f;
            }

            if (ValorSlow == 2)
            {
                Nivel_Teste.instancia.nivelSlow = 1.4f;
                this.ContagemSlow = 1.4f;
                this.valorInvertido = 0.71f;
            }

            if (ValorSlow == 1)
            {
                Nivel_Teste.instancia.nivelSlow = 1.2f;
                this.ContagemSlow = 1.2f;
                this.valorInvertido = 0.83f;
            }

            if (ValorSlow == 0)
            {
                Nivel_Teste.instancia.nivelSlow = 1;
                this.ContagemSlow = 1;
                this.valorInvertido = 1;
            }

            if (ValorSlow == -1)
            {
                Nivel_Teste.instancia.nivelSlow = 0.83f;
                this.ContagemSlow = 0.83f;
                this.valorInvertido = 1.2f;
            }

            if (ValorSlow == -2)
            {
                Nivel_Teste.instancia.nivelSlow = 0.71f;
                this.ContagemSlow = 0.71f;
                this.valorInvertido = 1.4f;
            }

            if (ValorSlow == -3)
            {
                Nivel_Teste.instancia.nivelSlow = 0.62f;
                this.ContagemSlow = 0.62f;
                this.valorInvertido = 1.6f;
            }

            mouseScrollAtual = mouseScroll;
        }

        private void moverPersonagem()
        {
            this.posicao += this.velocidade * velocidadeSlow;
            this.aceleracao = 0.04f * this.velocidadeSlow;

            if (Controller.KeyDown(Keys.D))
            {
                this.velocidade.X = MathHelper.Lerp(this.velocidade.X, velocidadeMax, aceleracao);
                moverX = true;

                //if (Nivel_Teste.instancia.fundo.posicao.X <= Nivel_Teste.instancia.fundo.textura.Width / 2)
                //{
                //    Nivel_Teste.instancia.fundo.posicao.X += 0.5f;
                //}
            }

            if (Controller.KeyDown(Keys.A))
            {
                this.velocidade.X = MathHelper.Lerp(this.velocidade.X, -velocidadeMax, aceleracao);
                moverX = true;

                //if (Nivel_Teste.instancia.fundo.posicao.X >= Nivel_Teste.instancia.fundo.textura.Width / 2)
                //{
                //    Nivel_Teste.instancia.fundo.posicao.X -= 0.5f;
                //}
            }

            if (Controller.KeyDown(Keys.W))
            {
                this.velocidade.Z = MathHelper.Lerp(this.velocidade.Z, -velocidadeMax, aceleracao);
                moverZ = true;

                //if (Nivel_Teste.instancia.fundo.posicao.Y <= Nivel_Teste.instancia.fundo.textura.Height / 2)
                //{
                //    Nivel_Teste.instancia.fundo.posicao.Y -= 0.5f;
                //}
            }

            if (Controller.KeyDown(Keys.S))
            {
                this.velocidade.Z = MathHelper.Lerp(this.velocidade.Z, velocidadeMax, aceleracao);
                moverZ = true;

                //if (Nivel_Teste.instancia.fundo.posicao.Y <= Nivel_Teste.instancia.fundo.textura.Height / 2)
                //{
                //    Nivel_Teste.instancia.fundo.posicao.Y -= 0.5f;
                //}
            }




            if ((!Controller.KeyDown(Keys.D)) && (!Controller.KeyDown(Keys.A)))
            {
                moverX = false;
            }

            if (moverX == false)
            {
                this.velocidade.X = MathHelper.Lerp(this.velocidade.X, 0, desaceleracao);
            }

            if ((!Controller.KeyDown(Keys.W)) && (!Controller.KeyDown(Keys.S)))
            {
                moverZ = false;
            }

            if (moverZ == false)
            {
                this.velocidade.Z = MathHelper.Lerp(this.velocidade.Z, 0, desaceleracao);
            }

        }

        public void TomouDano()
        {
            tomandoDano = true;
            tomandoDanoContagem = 0;
            this.vida -= 1;
        }
    }
}
